"""
图片验证码的接口文档
URL： /imagecode？imgcode_id=123r-xsf-f-32443&pre_imgcode_id=123r-xsf-f
查询参数： 名称              类型  是否必传  说明
      imgcode_id       str   是       当前图片的唯一标识： UUID
      pre_imgcode_id   str   是       上一个图片的唯一标识：UUID

请求方式：GET

响应的内容： 图片二进制流 bytes

"""
import json
import random
import re

from ronglian_sms_sdk import SmsSDK

import redis
from flask import request, make_response, current_app

from config import DevelopementConfig
from iHome import redis_store, db
from iHome.api_1_0 import api
from iHome.utils.captcha.captcha import captcha
from iHome.models import User

"""
1. 前端 根据 接口文档 url  发送 图片验证码的请求 GET
   imgcode_id pre_imgcode_id --js--UUID(怎么生成)
   
2.后端backend --- 写 图片验证码接口
  1. 接口
  2. 解析参数--查询参数--
  3. 校验参数--是否必传--是否复合格式
  4. 生成图片验证码--图片是给（前端的）
                -- 12345 码---》redis(set())---imgcode_id
  5.pre_imgcode_id redis--删除 上一个图片验证码
  6. 返回给前端 图片bytes 
        
"""


@api.route('/imagecode')
def generate_image_code():
    # 1. 解析参数--查询参数--
    query_param = request.args
    cur = query_param.get('cur')
    pre = query_param.get('pre')

    # 2. 校验参数 --是否为空-- 是否符合 UUID
    if (cur is None) or (cur == ''):
        return make_response({'errno': 5001, "errmsg": "cur参数是必填的！"})

    # 正则 校验UUID
    uuid_str_regex = "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$"
    if not re.match(uuid_str_regex, cur):
        return make_response({'errno': 5002, "errmsg": "cur/pre！的UUID 格式不对！"})

    # 3. 生成图片验证码
    text, image = captcha.generate_captcha()

    # 删除 上一个 text
    redis_store.delete('ImageCode_' + pre)
    # 4. 验证码 --text--存储在redis 数据库
    redis_store.setex('ImageCode_' + cur, 300, text)

    res = make_response(image)
    res.headers['Content-Type'] = 'image/jpg'
    return res


"""
短信验证码:
用户点击发送短信按钮

"""
"""
URL: /smscode
请求参数:      名称      类型     是否必传
手机号        mobile    string     是
图片验证码    sms_code   string     是
请求方式 : 
     get    
响应内容:
    json
    {'msg': '发送成功', 'code': '200'}
"""


@api.route("/smscode/", methods=['POST'])
def send_sms_code():
    """接收参数"""
    params = request

    mobile = params.json.get('mobile')

    img_code_text = params.json.get('text')
    img_code_id = params.json.get('id')

    """判空"""
    if not all([mobile, img_code_text, img_code_id]):
        return make_response({
            'errno': 4001,
            'errmsg': '参数不能为空!'
        })

    """校验正则"""
    if not re.match('^1[3-9]\d{9}$', mobile):
        return make_response({
            'errno': 4002,
            'errmsg': '手机号格式不正确'
        })

    """redis获取图片验证码"""
    redis_image_code = redis_store.get('ImageCode_' + img_code_id)
    """判断redis存储的数据是否存在"""
    if not redis_image_code:
        return make_response({
            'errno': 4003,
            'errmsg': '图片验证码过期'
        })

    """判断验证码是否一致"""
    if redis_image_code.decode() != img_code_text:
        return make_response({
            'errno': 4004,
            'errmsg': '图片验证码错误'
        })

    """删除已经使用的验证码"""
    redis_store.delete('ImageCode_' + img_code_id)

    redis_is = redis_store.get('SmsCode_' + str(mobile))

    if redis_is:
        return make_response({
            'errno': 4001,
            'errmsg': '请不要重复发送验证码'
        })

    """判断手机号是否注册"""
    user = User.query.filter_by(mobile=mobile).first()
    if user is not None:
        return make_response({
            'errno': 4001,
            'errmsg': '该手机号已被注册'
        })

    """发送短信  短信内容   位数"""
    sms_code_message = random.randint(100000, 999999)
    print('短信验证码: ' + str(sms_code_message))

    """使用第三方发送短信"""
    sdk_msg = SmsSDK(accId=DevelopementConfig.ACC_ID, accToken=DevelopementConfig.ACC_TOKEN, appId=DevelopementConfig.APP_ID)

    result = sdk_msg.sendMessage(1, mobile, datas=(sms_code_message, 5))
    print(result)
    print(type(result))

    """把json_str 转换为字典"""
    """json数据格式要求, key必须是双引号,外层有且只有一个大括号或者中括号,数据类型为bool或者数字可以不带引号,末尾不能带逗号"""
    result_dict = json.loads(result)
    if result_dict['statusCode'] == '111109':
        print('短信验证码发送成功' + str(sms_code_message))
    else:
        print('短信验证码发送失败')
        # return make_response({
        #     'errno': 4004,
        #     'errmsg': '短信验证码发送失败'
        # })

    """存储短信验证码的值,便于注册时验证"""
    redis_store.setex('SmsCode_' + str(mobile), 300, sms_code_message)


    """返回响应"""
    return make_response({
        'errno': 0,
        'errmsg': '发送短信验证码成功'
    })


























